<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title>LZXリファレンス javarpc</title>
  <othercredit role="translator">
    <firstname>Atuo</firstname>
    <surname>Seki</surname>
        <contrib>2006/05/16　翻訳初版</contrib>
 </othercredit>
<link rel="STYLESHEET" type="text/css" href="./styles.css" /></head>
<body>

<!-- ===================================================================== -->
<!-- = XML information goes here                                         = -->
<!-- ===================================================================== -->
<lzelement title="JavaRPC">
    <lztier>RPC Components</lztier>
    <lzcategory>RPC</lzcategory>
    <lzshortdesc>
             サーバーのJavaメソッドをリモートコールする。
    </lzshortdesc>
    <lztag>rpc/javarpc.xml</lztag>
</lzelement>

<p>JavaRPCの特徴はクライアントアプリケーションでサーバーサイドの
Javaオブジェクトとメソッドのアクセスを許可する事です。JavaRPCは
LaszloRPC群の一部でSOAPやXML-RPCと同様のAPIを共有します。詳細については<a
href="${dguide}rpc.html">RPC</a>又は<a
href="${dguide}rpc-javarpc.html">JavaRPC</a>の章の<a
href="${dguide}">Developer's Guide</a>をご覧ください。</p>

<p>このタグはJavaRPCオブジェクトを作成させます。 classname属性は、JavaRPCのクラスを指定します。
クラスを使用する為に、WEB-INF/classにクラスを置くか、またjarファイルならWEB-INFのlibに置いてください。
これでOpenLaszloサーバーからアクセスしやすくするでしょう。</p>

<p>securityエレメントでアプリケーションに使用されるJavaのクラスを宣言しなければなりません。
アクセスできないか、securityエレメントで定義されなかったクラスは参照する事が出来ません。
securityエレメントはこの様な感じに構成します:</p>

<example extract="false">
&lt;security&gt;
    &lt;allow&gt;
        &lt;pattern&gt;CLASS1&lt;/pattern&gt;
        &lt;pattern&gt;CLASS2&lt;/pattern&gt;
        ...
        &lt;pattern&gt;CLASSN&lt;/pattern&gt;
    &lt;/allow&gt;
&lt;/security&gt;
</example>

<p>各&lt;pattern&gt;は正規表現も可能です。</p>

<example extract="false">
&lt;security&gt;
    &lt;allow&gt;
        &lt;pattern&gt;^org\.openlaszlo&lt;/pattern&gt;
    &lt;/allow&gt;
&lt;/security&gt;
</example>

<p>サーバーに存在するjavaオブジェクトのメソッドをどう呼ぶかをこの例で示します:</p>

<example title="Passing different parameter types">
&lt;canvas debug="true" height="300" width="800"&gt;
 
    &lt;debug x="250" y="10" width="500" height="275" /&gt;

    &lt;security&gt;
        &lt;allow&gt;
            &lt;pattern&gt;^examples\.TypesExample&lt;/pattern&gt;
        &lt;/allow&gt;
    &lt;/security&gt;

    &lt;!-- See WEB-INF/classes/TypesExample.java for java source. --&gt;
    <em>&lt;javarpc name="types_example_rpc" scope="none" 
             classname="examples.TypesExample"&gt;</em>

        &lt;method event="onload"&gt;
            // Set buttons visible only after JavaRPC object loads
            canvas.buttons.setAttribute('visible', true);
        &lt;/method&gt;

        &lt;method event="ondata" args="res"&gt;
            Debug.write('(types ondata) response is:', res);
        &lt;/method&gt;

        &lt;method event="onerror" args="errmsg"&gt;
            Debug.write('(types onerror) error:', errmsg);
        &lt;/method&gt;

        &lt;!-- Declaratively pass an integer. --&gt;
        &lt;remotecall funcname="passInteger"&gt;
            &lt;param value="42" /&gt;
        &lt;/remotecall&gt;

        &lt;!-- Declaratively pass a double. Note that we name this function pd1
             because we have multiple remotecall declarations that call
             passDouble but with different parameters. --&gt;
        &lt;remotecall name="pd1" funcname="passDouble"&gt;
            &lt;param value="42.1" /&gt;
        &lt;/remotecall&gt;

        &lt;!-- Declaratively pass a double with 0 decimal. The 0 decimal will
             truncate and the number will become an integer type when it reaches
             the server. This call will fail. --&gt;
        &lt;remotecall name="pd2" funcname="passDouble"&gt;
            &lt;param value="42.0" /&gt;
        &lt;/remotecall&gt;

        &lt;!-- Declaratively pass a double with 0 decimal. Wrapping the double in
             DoubleWrapper will ensure the value will remain a double when
             reaching the server. --&gt;
        &lt;remotecall name="pd3" funcname="passDouble"&gt;
            &lt;param&gt; 
                &lt;method name="getValue"&gt;
                    return new LzRPC.DoubleWrapper(42.0);
                &lt;/method&gt;
            &lt;/param&gt;
        &lt;/remotecall&gt;

    &lt;/javarpc&gt;

    
    &lt;view name="buttons" visible="false" layout="spacing: 10" &gt;

        &lt;button text="pass integer"
                onclick="types_example_rpc.passInteger.invoke()" /&gt;

        &lt;button text="pass double"
                onclick="types_example_rpc.pd1.invoke()" /&gt;

        &lt;button text="pass double (will fail)"
                onclick="types_example_rpc.pd2.invoke()" /&gt;

        &lt;button text="pass double w/LzRPC.DoubleWrapper" 
                onclick="types_example_rpc.pd3.invoke()" /&gt;

        &lt;button text="pass boolean" onclick="this.passBoolean.invoke()"&gt;
            &lt;!-- This is a way to declare a remotecall closer to where it's being
                 used. The remotecontext must be set. --&gt;
            &lt;remotecall funcname="passBoolean" 
                        remotecontext="$once{ types_example_rpc }"&gt;
                &lt;param value="true" /&gt;
            &lt;/remotecall&gt;
        &lt;/button&gt;

        &lt;button text="pass array" onclick="this.passArray.invoke()"&gt;
            &lt;remotecall name="passArray" funcname="passClientArray" 
                        remotecontext="$once{ types_example_rpc }"&gt;
                &lt;param value="[1, 'a string', 4.5, false]" /&gt;
            &lt;/remotecall&gt;
        &lt;/button&gt;

        &lt;button text="pass hash" onclick="this.passObject.invoke()"&gt;
            &lt;remotecall name="passObject" funcname="passClientObject" 
                        remotecontext="$once{ types_example_rpc }"&gt;
                &lt;param value="{ a: 1, b: 3.14159, c: 'a string value', d: true}"&gt;
                &lt;/param&gt;
            &lt;/remotecall&gt;
        &lt;/button&gt;

    &lt;/view&gt;

&lt;/canvas&gt;
</example>

<p>Javaソースコードは
<tt>$LPS_HOME/WEB-INF/classes/examples</tt>で見る事ができます:</p>

<example extract="false">
package examples;

import java.util.Vector;
import java.util.Hashtable;

public class TypesExample {

    public static String passInteger(int i) {
        return "got integer parameter: " + i;
    }

    public static String passDouble(double d) {
        return "got double parameter: " + d;
    }

    public static String passBoolean(boolean b) {
        return "got boolean parameter: " + b;
    }

    public static String passClientArray(Vector v) {
        return "got vector parameter: " + v;
    }

    public static String passClientObject(Hashtable t) {
        return "got hashtable parameter: " + t;
    }

}
</example>

<p>JavaScriptのクライアントサイドパラメーターは以下のJavaのタイプに写されます：</p>

<p>
<table border="1">
<tr><th>JavaScriptデータタイプ</th><th>javaによって予測されたパラメータータイプ</th></tr>
<tr><td>Number (int)</td><td>int</td></tr>
<tr><td>Number (double)*</td><td>double</td></tr>
<tr><td>LzRPC.DoubleWrapper</td><td>double</td></tr>
<tr><td>Boolean</td><td>boolean</td></tr>
<tr><td>Array</td><td>Vector</td></tr>
<tr><td>Object</td><td>Hashtable</td></tr>
</table>
</p>

<p>* 0の小数部を持つあらゆる小数は、整数と考えられます。たとえば、
1.0は1になります。LzRPC.DoubleWrapperを使い、
数字が小数である事を保障してください。たとえば：</p>

<example extract="false">
    // assume myrpc is a javarpc object and myrpc.proxy.myMethod is a function
    // that expects a single double as a parameter
    var mydouble = new LzRPC.DoubleWrapper(1.0);
    myrpc.proxy.myMethod([ mydouble ], new LzDelegate(...));
</example>

<seealso>
<classes><a href="${reference}rpc.html">rpc</a></classes>
<classes><a href="${reference}sessionrpc.html">sessionrpc</a></classes>
<classes><a href="${reference}webapprpc.html">webapprpc</a></classes>
<classes><a href="${reference}soap.html">soap</a></classes>
<classes><a href="${reference}xmlrpc.html">xmlrpc</a></classes>
<classes><a href="${reference}remotecall.html">remotecall</a></classes>
<tags><a href="${reference}security.html">security</a></tags>
<a href="${dguide}rpc.html">Developer's Guide: RPC chapter</a>
<a href="${dguide}rpc-javarpc.html">Developer's Guide: JavaRPC chapter</a>
</seealso>

</body>
</html>
<!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
* Copyright 2001-2004 Laszlo Systems, Inc.  All Rights Reserved.              *
* Use is subject to license terms.                                            *
* X_LZ_COPYRIGHT_END ****************************************************** -->
